#ifndef SIMPLE_IO_HANDLER_BASE_H
#define SIMPLE_IO_HANDLER_BASE_H

#include <string>
#include <map>
#include <vector>
#include <memory>
#include <mutex>
#include "session.h"

namespace simple {
    /**
     * 事件处理器, 监听已注册的事件并执行
     *
     */
    class HandlerBase {

    private:
        static std::mutex mux;
        static std::map<std::string, std::vector<std::shared_ptr<HandlerBase>>> handlerMap_;

    public:
        virtual ~HandlerBase();

        /**
         * 获取处理器隐射
         */
        static const std::map<std::string, std::vector<std::shared_ptr<HandlerBase>>> &getHandlers();

        // 重置处理器
        static void resetHandlers();

        /**
         * 注册处理器
         */
        static bool registerHandler(const std::shared_ptr<HandlerBase> &);

        /**
         * 注销处理器
         */
        static bool unRegisterHandler(const std::shared_ptr<HandlerBase> &);

        /**
         * 发布全局事件, 监听的处理器会被执行
         *
         * @param event_name    事件名称
         * @param *session      会话对象
         */
        static bool publishEvent(const std::string &, Session *const);

        /**
         * 注册事件处理器后执行
         */
        virtual void register_hook() noexcept {};

        /**
         * 注销事件处理器后执行
         */
        virtual void unRegister_hook() noexcept {};

        /**
         * 监听的事件类型
         */
        virtual std::string eventName() = 0;

        /**
         * 响应事件
         */
        virtual void onEvent(Session *const session) noexcept = 0;
    };
}

#endif //SIMPLE_IO_HANDLER_BASE_H
